package com.brand.data.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class DateUtils {
	private static final String P_DAY = "yyyy-MM-dd";
	private static final String L_DAY = "yyyy年MM月dd日";
	private static final String S_DAY = "yyyyMMdd";
	private static final String P_SECOND = P_DAY+" HH:mm:ss";
	private static final String L_SECOND = L_DAY+" HH时mm分ss秒";
	private static final String S_SECOND = "yyyyMMddHHmmss";
	private static final String L_MON_MIN = "MM月dd日 hh:mm";
	
	public static DateFormat dateFormat(String pattern) {
		return new SimpleDateFormat(pattern);
	}
	/**
	 * 日期格式化：MM月dd日 hh:mm
	 * @param date
	 * @return
	 */
	public static String date2Str(Date date) {
		if(date==null){return "";}
		return dateFormat(L_MON_MIN).format(date);
	}
	/**
	 * 日期格式化：yyyyMMdd
	 * @param date
	 * @return
	 */
	public static String date2ShortDay(Date date) {
		if(date==null){return "";}
		return dateFormat(S_DAY).format(date);
	}
	/**
	 * 日期格式化
	 * @param date
	 * @param f 输入格式
	 * @return
	 */
	public static String formatDate(Date date,String f) {
		if(date==null){return "";}
		return dateFormat(f).format(date);
	}
	/**
	 * 解析时间字符串
	 * @param date
	 * @param f 输入格式
	 * @return
	 */
	public static Date parse(String dateStr,String pattern) {
		try {
			return dateFormat(pattern).parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 日期格式化：yyyy-MM-dd
	 * @param date
	 * @return
	 */
	public static String date2day(Date date) {
		if(date==null){return "";}
		return dateFormat(P_DAY).format(date);
	}
	/**
	 * 日期格式化：yyyyMMddHHmmss
	 * @param date
	 * @return
	 */
	public static String date2second(Date date) {
		if(date==null){return "";}
		return dateFormat(S_SECOND).format(date);
	}
	/**
	 * 日期格式化：yyyy-MM-dd HH:mm:ss
	 * @param date
	 * @return
	 */
	public static String date4second(Date date) {
		if(date==null){return "";}
		return dateFormat(P_SECOND).format(date);
	}
	/**
	 * 日期格式化：yyyy年MM月dd日 HH时mm分ss秒
	 * @param date
	 * @return
	 */
	public static String date4localSecond(Date date) {
		if(date==null){return "";}
		return dateFormat(L_SECOND).format(date);
	}
	/**
	 * 日期格式化：yyyy年MM月dd日
	 * @param date
	 * @return
	 */
	public static String date4localDay(Date date) {
		if(date==null){return "";}
		return dateFormat(L_DAY).format(date);
	}
	/**
	 * 获取当前时间时间戳
	 * @return
	 */
	public static String getTimeStamp(){
		return DateUtils.date2second(now());
	}
	/**
	 * 获取当前时间
	 * @return
	 */
	public static Date now(){
		return Calendar.getInstance().getTime();
	}
	
	/**
	 * 字符串格式化：yyyy-MM-dd HH:mm:ss
	 * @param date
	 * @return
	 */
	public static Date str2Date(String datestr) {
		try {
			return dateFormat(P_SECOND).parse(datestr);
		} catch (ParseException e) {
			return null;
		}
	}
	/**
	 * 字符串格式化：yyyy-MM-dd
	 * @param date
	 * @return
	 */
	public static Date str2day(String datestr) {
		try {
			return dateFormat(P_DAY).parse(datestr);
		} catch (ParseException e) {
			return null;
		}
	}
	/**
	 * 字符串格式化：yyyy-MM
	 * @param date
	 * @return
	 */
	public static Date getMonth(String datestr) {
		try {
			return dateFormat("yyyy-MM").parse(datestr);
		} catch (ParseException e) {
			return null;
		}
	}
	/**
	 * 截取到月份
	 * @param date
	 * @return
	 */
	public static Date getMonth(Date date) {
		try {
			DateFormat df = dateFormat("yyyy-MM");
			return df.parse(df.format(date));
		} catch (ParseException e) {
			return null;
		}
	}
	/**
	 * 获取日
	 * @param d
	 * @return
	 */
	public static int getDay(Date d){
		Calendar cal=Calendar.getInstance();
		cal.setTime(d);
		return cal.get(Calendar.DAY_OF_MONTH);
	}
	/**
	 * 获取下个日期
	 * @param d
	 * @param year
	 * @param mon
	 * @param day
	 * @return
	 */
	public static Date rollDate(Date d,int year,int mon,int day){
		Calendar cal=Calendar.getInstance();
		cal.setTime(d);
		cal.add(Calendar.YEAR, year);
		cal.add(Calendar.MONTH, mon);
		cal.add(Calendar.DAY_OF_MONTH, day);
		return cal.getTime();
	}
	/**
	 * 获取当前时间的秒数字符串
	 * @return
	 */
	public static String getNowTimeStr(){
		return Long.toString(System.currentTimeMillis() / 1000);
	}
	/**
	 * 计算两个时间的时间差
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public static String dateDiff(Date startTime,Date endTime){
		long nd = 1000*24*60*60;//一天的毫秒数
		long nh = 1000*60*60;//一小时的毫秒数
		long nm = 1000*60;//一分钟的毫秒数
		long ns = 1000;//一秒的毫秒数
		
		long diff = endTime.getTime()-startTime.getTime();
		long day = diff/nd;//计算差多少天
		long hour = diff%nd/nh;//计算差多少小时
		long min = diff%nd%nh/nm;//计算差多少分钟
		long sec = diff%nd%nh%nm/ns;//计算差多少秒//输出结果
		String daystr = day<10?"0"+day:""+day;
		String hourstr = hour<10?"0"+hour:""+hour;
		String minstr = min<10?"0"+min:""+min;
		String secstr = sec<10?"0"+sec:""+sec;
		
		return daystr+"天"+hourstr+"小时"+minstr+"分钟"+secstr+"秒";
	}
	/**
	 * 计算两个时间的时间差
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public static long diff(Date startTime,Date endTime){
		return endTime.getTime() - startTime.getTime();
	}
	/**
	 * 用于返回指定日期格式的月份增加指定月数的月份
	 * 
	 * @param dateStr 指定月份
	 * @param format 指定日期格式
	 * @param months 指定月数
	 * @return 指定日期格式的月数增加指定月数的月数
	 */
	public static String rollMonth(String dateStr, String format, int months) {
		String future = "";
		try {
			DateFormat df = dateFormat(format);
			Date date = rollMonth( df.parse(dateStr), months);
			future = df.format(date);
		} catch (Exception e) {

		}
		return future;
	}
	/**
	 * 用于返回指定日期格式的月份增加指定月数的月份
	 * 
	 * @param date 指定月份
	 * @param format 指定日期格式
	 * @param months 指定月数
	 * @return 指定日期格式的月数增加指定月数的月数
	 */
	public static Date rollMonth(Date date,  int months) {
		try {
			date = rollDate( date, months, Calendar.MONTH);
		} catch (Exception e) {
			
		}
		return date;
	}
	/**
	 * 用于返回指定日期格式的月份增加指定月数的月份
	 * 
	 * @param date 指定月份
	 * @param format 指定日期格式
	 * @param months 指定月数
	 * @return 指定日期格式的月数增加指定月数的月数
	 */
	public static String rollMonth(Date date, DateFormat df, int months) {
		String future = "";
		try {
			date = rollDate( date, months, Calendar.MONTH);
			future = df.format(date);
		} catch (Exception e) {
			
		}
		return future;
	}
	/**
	 * 用于返回指定日期格式的月份增加指定月数的月份
	 * 
	 * @param date 指定日期
	 * @param num 指定数量
	 * @param type 指定类型，年月日
	 * @return
	 */
	private static Date rollDate(Date date, int num,int type) {
		Date future = null;
		try {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(date);
			calendar.add(type, num);
			future = calendar.getTime();
		} catch (Exception e) {
			
		}
		return future;
	}
	/**
	 * 用于返回指定日期格式的日期增加指定天数的日期
	 * @param dateStr 指定日期
	 * @param format 指定日期格式
	 * @param days 指定天数
	 * @return 指定日期格式的日期增加指定天数的日期
	 */
	public static String rollDay(String dateStr, String format, int days) {
		String future = "";
		try {
			DateFormat df = dateFormat(format);
			Date date = rollDay(df.parse(dateStr), days);
			future = df.format(date);
		} catch (Exception e) {
		}
		return future;
	}
	/**
	 * 用于返回指定日期格式的日期增加指定天数的日期
	 * @param date 指定日期
	 * @param days 指定天数
	 * @return 指定日期格式的日期增加指定天数的日期
	 */
	public static Date rollDay(Date date, int days) {
		return rollDate(date, days, Calendar.DATE);
	}
	/** 
     * 获取两个日期相差的天数 
     * @param date 日期字符串 
     * @param otherDate 另一个日期字符串 
     * @return 相差天数 
     */  
    public static long daysBetween(String date, String otherDate) {  
        return daysBetween(str2day(date), str2day(otherDate));  
    }  
      
    /** 
     * @param date 日期 
     * @param otherDate 另一个日期 
     * @return 相差天数 
     */  
    public static long daysBetween(Date start, Date end) {
        long time = end.getTime()-start.getTime();  
        return time/(24 * 3600* 1000);  
    }  
	
    /** 
     * 判断时间是否是今天 
     * @param dateStr  指定日期
     * @return 
     */  
    public static boolean isToday(String dateStr) {  
        String today = dateFormat(P_DAY).format(now());
        //指定时间与判断时间日期相等
    	return today.equals(dateStr);
    }
    /** 
     * 获取两个日期之间的月份
     * @param dateStr  指定日期
     * @return 
     */  
    public static List<String> getMonthsBetween(Date minDate,Date maxDate) {  
		List<String> result = new ArrayList<String>();
	    DateFormat df = dateFormat("yyyy-MM");
	
	    Calendar min = Calendar.getInstance();
	    Calendar max = Calendar.getInstance();
	
	    min.setTime(minDate);
	    min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
	
	    max.setTime(maxDate);
	    max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
	
	    Calendar curr = min;
	    while (curr.before(max)) {
	     result.add(df.format(curr.getTime()));
	     curr.add(Calendar.MONTH, 1);
	    }
	    return result;
    }
    public static String formatDate(Date date,DateFormat format){
    	return format.format(date);
    }
    public static Date parseStr(String dateStr,DateFormat format){
    	try {
			return format.parse(dateStr);
		} catch (ParseException e) {
		}
		return null;
    }
}
